/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Fuente;

import java.net.*;
import java.io.*;
import javax.swing.*;

/**
 *
 * @author Julio Lemus
 */
public class SocketCliente extends Thread{
    private boolean escuchando, jugar;
    private ServerSocket server;
    private Socket connection;
    private ObjectInputStream entrada;
    private ObjectOutputStream salida;
    JLabel lblNumm, lblJg11, lblJg22, lblRess, lblGradoo, lblNomJJ, lblIndd;
    JTextField lblIP, lblPort;
    /*Variables del Juego*/
    private boolean turno;
    
    public SocketCliente(JLabel lbln, JLabel lj1,JLabel lj2, JLabel lr, JLabel lg,
            JLabel lblnom, JLabel lbli,JTextField lblipp,JTextField lblport) {
        escuchando = false;
        jugar = false;
        turno = false;
        this.lblNumm = lbln;
        this.lblJg11 = lj1;
        this.lblJg22 = lj2;
        this.lblRess = lr;
        this.lblGradoo = lr;
        this.lblNomJJ = lblnom;
        this.lblIndd = lbli;
        this.lblIP = lblipp;
        this.lblPort = lblport;
    }
    
    public void escuchar(boolean estado) throws IOException {
        escuchando = estado;
        if (!estado) {
            if (connection != null) {
                connection.close();
            }
            if (entrada != null){
                entrada.close();
            }
            if (salida != null){
                salida.close();
            }
            server.close();
        }
    }
    
    @Override
    public void run() {
        try {
            server = new ServerSocket(1235);
            while (escuchando) {
                conectarAServidor();
                obtenerFlujos();
                procesarConexion();
            }
        } catch (Exception e) {
            escuchando = false;
            System.err.println(e);
        }
    }
    
    private void conectarAServidor(){
        try{
            System.out.print("IP: " + lblIP.getText());
            System.out.println(" \tPuerto: " + lblPort.getText());
            connection = new Socket(InetAddress.getByName(lblIP.getText()), Integer.parseInt(lblPort.getText()));
            setJugar(true);
            lblIndd.setText("Conectado");
        }catch (Exception e) {
            System.err.println("Error: " + e.getMessage());
            try{
                escuchar(false);
            }catch(IOException e2){
                System.out.println("Error 2 Conectar Servidor. \nError: "+e2.getMessage());
            }
        }
    }
    
    private void obtenerFlujos(){
        try{
            // Paso 3: obtener flujos de entrada y salida.
            salida = new ObjectOutputStream(connection.getOutputStream());
            salida.flush();
            // establecer flujo de entrada para los objetos
            entrada = new ObjectInputStream(connection.getInputStream());
            lblIndd.setText("Esperando al Servidor a iniciar nuevo juego");
        }catch (Exception e) {
            System.err.println("Error: (obtener flujos)"+e);
//            warnUser("Error en el socket\nError: "+e.getMessage(),"Socket Servidor",0);
            try{
                escuchar(false);
            }catch(IOException exx){
                System.out.println("Error 2 flujo. Error: "+exx.getMessage());
            }
        }
    }
    
    private void procesarConexion(){
        int codigo;
        String contenido;
        while(isJugar()){
            try{
                contenido = (String)entrada.readObject();
                if (contenido.equalsIgnoreCase("1")){//Iniciar Partida
                    lblIndd.setText("Esperando por turno del Servidor");
                    lblNumm.setEnabled(false);
                    turno = false;
                    enviarDatos("1");
                }else if (contenido.equalsIgnoreCase("2")){ //Cambio de turno
                    if (turno == false){
                        lblIndd.setText("Su turno");
                        lblNumm.setEnabled(true);
                    }else{
                        lblIndd.setText("Esperando por turno del Servidor");
                        lblNumm.setEnabled(false);
                    }
                    turno = !turno;
                }
            }catch (IOException | ClassNotFoundException e) {
                System.err.println(e);
                setJugar(false);
                try{
                    escuchar(false);
                }catch(IOException exx){
                    System.out.println("Error 2 procesos. Error: "+exx.getMessage());
                }
            }
        }
    }
    
    public void CambiarEstado_Turno(){
        if (turno){
            lblIndd.setText("Esperando por turno del Servidor");
            lblNumm.setEnabled(false);
        }
        turno = !turno;
    }
    
    public void enviarDatos(String mensaje){
        // enviar objeto al servidor
        try {
            System.out.println("Cliente dice: "+mensaje);
            salida.writeObject(mensaje);
            salida.flush();
        }catch (IOException excepcionES) {
            System.err.println("Error al escribir objeto. \n" + excepcionES.getMessage());
        }
    }

    /**
     * @return the turno
     */
    public boolean isTurno() {
        return turno;
    }

    /**
     * @param turno the turno to set
     */
    public void setTurno(boolean turno) {
        this.turno = turno;
    }

    /**
     * @return the jugar
     */
    public boolean isJugar() {
        return jugar;
    }

    /**
     * @param jugar the jugar to set
     */
    public void setJugar(boolean jugar) {
        this.jugar = jugar;
    }
}
